﻿#ifndef MEASUREDATA_H
#define MEASUREDATA_H

#include <QRect>
#include <QString>
#include <QList>
// MEASURE_DIR 表示当前测点是测量横向距离还是竖向距离。还有寻边的方向
enum MEASURE_DIR {TOP_BOTTOM, BOTTOM_TOP, LEFT_RIGHT, RIGHT_LEFT};

// MEASURE_PATTERN 表示寻边时的依据的特征
enum MEASURE_PATTERN{WHITE_BLACK, BLACK_WHITE, BOTH};

/**
 * @brief The MeasurePoint struct 表示一个测点。在这个测点上拍摄一张照片寻找一个特定的边。
 */
struct MeasurePoint
{
    double x_mm = 0;
    double y_mm = 0;
    double z_mm = 0;
    double scale = 0;
    int lens = 0;
    MEASURE_DIR dir;
    MEASURE_PATTERN pattern;
    QRect roi;
    int topLampIntensity = 0; //上光源的亮度
    int bottomLampIntensity = 0; //下光源的亮度
    double exposure = 0; //相机的曝光时间
    double value_mm = 0;// 到中心点的距离。这个值是测量值,属于中间值，不保存到数据库，单位mm
};


/**
 * @brief The MeasurePair class 表示一个测量项，一个测量项包括起点和终点。
 */
struct MeasurePair
{
    int specID; // 存入数据库时需要这个参数。用来确定是一个 Recipe 里的哪个Spec
    QString name; // 这个测量对象的名称。比如：CF面宽度， TFT面电机边长度 等
    int side = 0;// CF 面为 1， TFT 面 为 0
    MeasurePoint start;
    MeasurePoint end;
    double CL = 0; // 中心线，也就是标准值
    double UCL = 0; //管控上限，upper control limit
    double LCL = 0; //管控下限
    double USL = 0; //规格上限，upper spec limit
    double LSL = 0; //规格下限

    bool stop = false;//测量完成后是否需要暂停。（针对样品需要翻面后再进行后面的测量的情况。暂停时显微镜回归原点，等待操作者翻面后继续。）
    QString stopMessage;// 暂停时给出的提示。
    double value_mm = 0; //测量出的距离值。建Recipe时不需要，数据入库时需要
};

/**
 * @brief The MeasurementData class 表示一张屏的全部测试数据
 */
class MeasurementData
{
public:
    MeasurementData();
    void clear();
    void buildData(int N);
    void append(MeasurePair d);
    void setData(MeasurePair d);//替换当前位置的数据
    void setRecipeName(QString name, int id, QString description);
    void setLineName(QString lineName, int id) ;
    void setPanelID( QString id);
    bool next(); // 转到下一个测量项目。如果超出范围则返回 false
    bool prev(); // 转到上一个测量项目。如果超出范围则返回 false
    bool moveTo(int index);// 转到第 index 个测量项目。如果超出范围则返回 false
    int index() {return m_current;}
    MeasurePair& currentMeasure();
    QString description() const {return m_description;}
    QString recipeName() const {return m_recipeName;}
    int recipeID() {return m_recipeID;}

    QString panelID() const {return m_panelID;}

    QString lineName() {return m_lineName;}
    int lineID() {return m_lineID;}
    int count() const {return m_measure.size();}
private:
    QString m_recipeName;
    int m_recipeID;
    QString m_lineName;
    int m_lineID;
    QString m_description;
    QList<MeasurePair> m_measure;
    QString m_panelID;
    int m_current = 0;
private:

};



#endif // MEASUREDATA_H
